<?php
/**
 * Push报表业务基础类(Service)
 *   
 * @author wenqiang@6rooms.com
 * @version $Id: Base.php,v 1.0 2013/11/29 15:11:29 gaowenqiang Exp $   
 * @package service   
 *
 */
abstract class Sr_Service_Report_Base extends Sr_Service_Base
{
	const STAT_TYPE_DAY = 1;// 按天统计
	const STAT_TYPE_HOUR = 2;// 按小时统计
	const STAT_TYPE_HALFHOUR = 3;// 按半小时统计
	
	// 类名后辍
	const SUFFIX_STAT_TYPE_DAY = '_DAY';// 天
	const SUFFIX_STAT_TYPE_HOUR = '_HOUR';// 小时
	const SUFFIX_STAT_TYPE_HALFHOUR = '_HALFHOUR';// 半小时

	// 数据源类型
	const DATA_SOURCE_TYPE_ARRAY = 1;
	const DATA_SOURCE_TYPE_FILE = 2;

	/**
	 * 构造器
	 *
	 * @param int $type
	 * @param string $start
	 * @param string $end
	 * @param array $params
	 *
	 */
	public function __construct($type)
	{
		parent::__construct(array('type' => $type));
	}

	/**
	 * 初始化
	 *
	 */
	protected function init($options)
	{
		// 内部参数项
		$fields = array(
			'type' => null,
		);

		$this->addFields($fields);

		$this->setOptions($options);
	}
	
	/**
	 * 设置报表统计类型
	 *
	 * @param int $type 统计类型
	 * @return int
	 *
	 */
	protected function setType($type)
	{
		if (in_array((int)$type, array(self::STAT_TYPE_DAY, 
								  self::STAT_TYPE_HOUR, 
								  self::STAT_TYPE_HALFHOUR)))
		{
			return $this->setOption('type', (int)$type);
		}

		return 0;
	}

	/**
	 * 获取后辍名
	 *
	 * @param int $type 统计类型
	 * @return string
	 *
	 */
	protected function getSuffixByType($type = null) {
		if (!in_array($type, array(self::STAT_TYPE_DAY, 
								  self::STAT_TYPE_HOUR, 
								  self::STAT_TYPE_HALFHOUR)))
		{
			$type = $this->getOption('type');
		}

		$suffix = null;
		// 添加统计列
		switch ($type) {
			case self::STAT_TYPE_DAY :
				$suffix = '_DAY';
				break;
			case self::STAT_TYPE_HOUR :
				$suffix = '_HOUR';
				break;
			case self::STAT_TYPE_HALFHOUR :
				$suffix = '_HALFHOUR';
				break;
			default:
				return false;
		}

		return $suffix;
	}
	
	/*
		 加载具体的report_service
		 为rs进进数据源，参数配置
		 执行rs的统计方法
		 将计算结果写入数据文件
		 计算完成后将结果写入目标表
	*/
	

	/**
	 * 自动加载内部类(service, model)
	 * 
	 * @param string $name 
	 * @return mixed (Class Type: Sr_Service_Base|Sr_Model_Base| other Class)
	 *
	 */
	/*
	protected function __get($name)
	{
		$matches = array();
		if (preg_match('/^(s|m)_([\w\_]+)$/', $name, $matches) != 0) {
			$fun = isset($matches[1]) && $matches[1] ? $matches : null;
			if (strlen($fun) && in_array($fun, array('model', 'service'))) {
				$param = isset($matches[2]) && $matches[2] ? $matches[2] : null;// 短类名(无前辍)
				return call_user_func(array($this, $fun), $param);
			}
		}

		return false;
	}
	*/
	
	/*
	protected function getModelName($shortName, $addPrefix = false)
	{
		$prefix = $addPrefix ? self::CLASS_PREFIX_MODEL : null;
		$suffix = $this->getSuffixByType();
		$className = $prefix . $shortName . $suffix;
		
		return $className;
	}
	*/

	/**
	 * 获取Service对象
	 *
	 * @param string $name 短类名
	 * @param mixed $args 参数
	 * @return object (Class Type: Sr_Service_Base)
	 *
	 */
	protected function service($name, $args = null)
	{
		$prefix = 'Report_';
		$name = $prefix . $name;
		return parent::service($name, $args);
	}
	
	/**
	 * 获取Stat Model对象
	 *
	 * @param string $name 短类名
	 * @param mixed $args 参数
	 * @return object (Class Type: Sr_Model_Base)
	 *
	 */
	protected function modelByStat($name, $args = null)
	{
		$prefix = 'Stat_';
		return parent::model($name, $args, $prefix);
	}
	
	/**
	 * 获取Report Model对象
	 *
	 * @param string $name 短类名
	 * @param mixed $args 参数
	 * @return object (Class Type: Sr_Model_Base)
	 *
	 */
	protected function model($name, $args = null)
	{
		$prefix = 'Report_';
		$suffix = $this->getSuffixByType();
		$name = $prefix . $name . $suffix;
		return parent::model($name, $args);
	}

	/*
	 * 有参构造方法, 可对计算源Model进行配置, 目标进行配置
	 */
	// 设置配置参数方法(参数可对p1, p2进行设置)
	// P1:需计算的组名称([Push|other])
	// P2:时间类型(天|小时|半小时)

	// 清除配置参数方法, 将参数还原为默认值

	// F:根据配置参数, 获取结果表对应的Model名称

	// F:计算(调用model类获取计算数据, 并写入数据文件)
	
	abstract public function stat($start, $end, $input = array());

	// 保存
	/**
	 * 保存统计结果
	 *
	 * @param string $filename
	 * @return bool
	 *
	 */
	abstract public function save($data, $dataSource = self::DATA_SOURCE_TYPE_FILE);
}

